import os
import shutil
import zipfile
import tempfile
import boto3
from configuration import get_boto3_client

def publish():
    """
    列出当前目录的所有py文件（除了configuration.py和publish.py），
    让用户选择一个文件进行build，然后打包并上传到S3
    """
    # 获取当前目录下的所有py文件
    current_dir = os.getcwd()
    py_files = []
    
    for file in os.listdir(current_dir):
        if file.endswith('.py') and file not in ['configuration.py', 'publish.py', 'main.py', 'common.py', 'publish_js.py']:
            py_files.append(file)
    
    if not py_files:
        print("当前目录下没有找到可用的Python文件（除了configuration.py和publish.py）")
        return
    
    # 显示可用的py文件
    print("可用的Python文件：")
    for i, file in enumerate(py_files, 1):
        print(f"{i}. {file}")
    
    # 让用户选择文件
    while True:
        try:
            choice = input(f"\n请选择一个文件 (1-{len(py_files)}): ")
            choice_index = int(choice) - 1
            
            if 0 <= choice_index < len(py_files):
                selected_file = py_files[choice_index]
                break
            else:
                print(f"请输入1到{len(py_files)}之间的数字")
        except ValueError:
            print("请输入有效的数字")
    
    print(f"\n选择的文件: {selected_file}")
    
    # 创建临时目录
    temp_dir = tempfile.mkdtemp()
    print(f"创建临时目录: {temp_dir}")
    
    try:
        # 复制选择的py文件到临时目录，并重命名为lambda_function.py
        lambda_function_path = os.path.join(temp_dir, 'lambda_function.py')
        shutil.copy2(selected_file, lambda_function_path)
        print(f"复制 {selected_file} 到临时目录并重命名为 lambda_function.py")
        
        # 复制configuration.py到临时目录
        shutil.copy2('configuration.py', temp_dir)
        print("复制 configuration.py 到临时目录")
        
        # 复制common.py到临时目录
        shutil.copy2('common.py', temp_dir)
        print("复制 common.py 到临时目录")
        
        # 复制package目录下的所有内容到临时目录
        package_dir = os.path.join(current_dir, 'package')
        if os.path.exists(package_dir):
            for item in os.listdir(package_dir):
                source_path = os.path.join(package_dir, item)
                dest_path = os.path.join(temp_dir, item)
                if os.path.isdir(source_path):
                    shutil.copytree(source_path, dest_path)
                else:
                    shutil.copy2(source_path, dest_path)
            print("复制 package 目录下的内容到临时目录")
        else:
            print("警告: package 目录不存在")
        
        # 查找并复制对应的私有包目录
        file_name_without_ext = os.path.splitext(selected_file)[0]
        private_package_dir = os.path.join(current_dir, f"{file_name_without_ext}_package")
        if os.path.exists(private_package_dir):
            print(f"找到私有包目录: {private_package_dir}")
            for item in os.listdir(private_package_dir):
                source_path = os.path.join(private_package_dir, item)
                dest_path = os.path.join(temp_dir, item)
                if os.path.isdir(source_path):
                    # 如果目标目录已存在，先删除再复制
                    if os.path.exists(dest_path):
                        shutil.rmtree(dest_path)
                    shutil.copytree(source_path, dest_path)
                else:
                    shutil.copy2(source_path, dest_path)
            print(f"复制私有包 {file_name_without_ext}_package 目录下的内容到临时目录（覆盖公共包）")
        else:
            print(f"未找到私有包目录: {private_package_dir}")
        
        # 创建zip文件
        zip_filename = f"{os.path.splitext(selected_file)[0]}.zip"
        zip_path = os.path.join(current_dir, zip_filename)
        
        with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
            for root, dirs, files in os.walk(temp_dir):
                for file in files:
                    file_path = os.path.join(root, file)
                    arcname = os.path.relpath(file_path, temp_dir)
                    zipf.write(file_path, arcname)
        
        print(f"创建zip文件: {zip_filename}")
        
        # 上传到S3
        s3_client = get_boto3_client('s3')
        bucket_name = 'zhuchundashuaige'
        s3_key = f'lambda_publish/{zip_filename}'
        
        print(f"上传到S3: s3://{bucket_name}/{s3_key}")
        s3_client.upload_file(zip_path, bucket_name, s3_key)
        
        print(f"✅ 成功上传 {zip_filename} 到 s3://{bucket_name}/{s3_key}")
        
        # 清理临时文件
        os.remove(zip_path)
        print(f"清理临时zip文件: {zip_filename}")
        
    except Exception as e:
        print(f"❌ 错误: {str(e)}")
    finally:
        # 清理临时目录
        shutil.rmtree(temp_dir)
        print(f"清理临时目录: {temp_dir}")

if __name__ == "__main__":
    publish()
